float _FurLength;
float _FurGravityStrength;
[instance(4)]
[maxvertexcount(20)]
void geomFur(triangle v2f IN[3], inout TriangleStream < v2f > tristream, uint InstanceID : SV_GSInstanceID)
{
	float4 fur_worldPos[3];
	v2f o_fur[3];
	float3 offset = (float3(0, -1, 0) * (_FurLength*.9) *_FurGravityStrength);
	for (int i = 0; i < 3; i++)
	{
		if (InstanceID == 0) {
			IN[i].furAlpha = 0;
			tristream.Append(IN[i]);
		}
		o_fur[i] = IN[i];
		fur_worldPos[i] = float4(IN[i].worldPos + IN[i].normal * _FurLength, 1);
	}
	if (InstanceID == 0) {
		tristream.RestartStrip();
	}
	int Total_FurLayers = clamp(floor(_FurLayers * (1 - smoothstep(_FurMinDistance, _FurMaxDistance, distance(IN[0].worldPos, getCameraPosition())))), min(1, _FurLayers), _FurLayers);
	int startLayer = max(int(InstanceID) * 6 - 1, 0);
	for (int layer = startLayer; layer < Total_FurLayers; layer++) {
		for (int i = 0; i < 3; i++) {
			o_fur[i].furAlpha = float(layer) / Total_FurLayers;
			o_fur[i].worldPos = float4(lerp(IN[i].worldPos, fur_worldPos[i] + offset * o_fur[i].furAlpha, o_fur[i].furAlpha),1);
			o_fur[i].pos = UnityWorldToClipPos(o_fur[i].worldPos);
			o_fur[i].furAlpha += .01;
			tristream.Append(o_fur[i]);
		}
		tristream.RestartStrip();
	}
}
